package org.smile.db.sql;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * 一个封装了表信息的对象
 * @author strive
 *
 */
public class TableInfo
{
	/**
	 * 关键字段
	 */
	private String[] keyFields;
	/**
	 * 查询字段
	 */
	private String[] queryFields;
	
	/**
	 * 所有的字段
	 */
	private Map<String,Object> fields=new HashMap<String,Object>();
	/**
	 * 表名
	 */
	private String tableName;
	/**
	 * 过滤
	 */
	private String filterStr;
	/**
	 * 排序
	 */
	private String orderStr;
	
	public TableInfo()
	{}
	/**
	 * 构造方法
	 * @param tableName 名称
	 */
	public TableInfo(String tableName)
	{
		this.tableName=tableName;
	}
	public Map<String, Object> getFields()
	{
		return fields;
	}
	public void setFields(Map<String, Object> fields)
	{
		this.fields = fields;
	}
	public String getTableName()
	{
		return tableName;
	}
	/**
	 * 设置表名
	 * @param tableName
	 */
	public void setTableName(String tableName)
	{
		this.tableName = tableName;
	}
	public String getFilterStr()
	{
		return filterStr;
	}
	/**
	 * 设置过滤子句
	 * @param filterStr
	 */
	public void setFilterStr(String filterStr)
	{
		this.filterStr = filterStr;
	}
	/**
	 * 设置一个 字段 ֵ
	 * @param key 
	 * @param valueֵ
	 */
	public void setField(String key,Object value)
	{
		this.fields.put(key, value);
	}
	/**
	 *清空所有信息
	 */
	public void clear()
	{
		this.fields.clear();
		this.filterStr=null;
		this.keyFields=null;
	}
	
	/**
	 * 转化为插入语句
	 * @return
	 */
	public ParamParser getInsertSQLParams()
	{
		StringBuffer sql=new StringBuffer();
		Set<String> keys=this.fields.keySet();
		
		int i=0,len=keys.size();
		Object[] params=new Object[len];
		sql.append("INSERT INTO ").append(this.tableName).append("(");
		for(String key:keys)
		{
			sql.append(key);
			if(i<len-1)
			{
				sql.append(",");
			}
			i++;
		}
		sql.append(") VALUES (");
		i=0;
		for(String key:keys)
		{
			sql.append("?");
		    params[i]=fields.get(key);
			if(i<len-1){sql.append(",");}
			i++;
		}
		sql.append(")");
		return new ParamParser(sql.toString(),params);
	}
	
	/**
	 * 转化成一个UPDATE语句
	 * 
	 * 此语句的过滤子句的规则是：
	 * 当设置了过滤子句 filterStr则过滤子句为filterStr;
	 * 当没有设置filterStr时候，如设置了关键字段keyFields则会按照关键字段的值构建一个过滤字句
	 * 如二者皆没有设置 那么就没有过滤子句
	 * @return UPDATE语句的字符串　
	 */
	public ParamParser getUpdateSQLParams()
	{
		StringBuffer sql=new StringBuffer();
		sql.append("UPDATE ").append(this.tableName).append(" SET ");
		Set<String> keys=this.fields.keySet();
		List params=new ArrayList();
		int i=0,len=keys.size();
		for(String key:keys)
		{
			sql.append(key).append("=").append("?");
			params.add(fields.get(key));
			if(i<len-1){sql.append(",");}
			i++;
		}
		if(this.filterStr!=null)
		{
			sql.append(" WHERE ").append(this.filterStr);
		}
		else if(this.keyFields!=null)
		{
			sql.append(" WHERE ");
			//从设置的关键字段构建where字句
			i=0;len=this.keyFields.length;
			for(;i<len;i++)
			{
				sql.append(keyFields[i]).append("=?");
				params.add(fields.get(keyFields[i]));
				if(i<len-1){sql.append(" AND ");}
				i++;
			}
		}
		return new ParamParser(sql.toString(),params.toArray());
	}
	/**
	 * 转化成一个SELECT语句
	 * 
	 * 
	 * @return SELECT语句的字符串　
	 */
	public ParamParser getSelectSQLParams(){
		StringBuffer sql=new StringBuffer();
		List param=new ArrayList();
		sql.append("SELECT ");
		if(this.queryFields==null){
			sql.append(" * ");
		}else{
			int i=0;
			for(;i<this.queryFields.length;i++){
				sql.append(queryFields[i]);
			}
			if(i<queryFields.length-1){
				sql.append(",");
			}
		}
		sql.append(" FROM  ").append(this.tableName);
		
		if(this.filterStr!=null)
		{
			sql.append(" WHERE ").append(this.filterStr);
		}else if(this.keyFields!=null)
		{
			this.addKeyFieldWhere(sql, param);
		}
		if(orderStr!=null){
			sql.append(" ORDER BY ").append(orderStr);
		}
		return new ParamParser(sql.toString(),param.toArray());
	}
	
	/**
	 * 转化成一个DELETE语句 就是把一个标识符修改
	 * 
	 * 此语句的过滤子句的规则是：
	 * 当设置了过滤子句 filterStr则过滤子句为filterStr;
	 * 当没有设置filterStr时候，如设置了关键字段keyFields则会按照关键字段的值构建一个过滤字句
	 * 如二者皆没有设置 那么就没有过滤子句
	 * @return
	 */
	public ParamParser getDeleteSQLParams()
	{
		StringBuffer sql=new StringBuffer();
		List param=new ArrayList();
		sql.append("DELETE FROM ").append(this.tableName);
		if(this.filterStr!=null)
		{
			sql.append(" WHERE ").append(this.filterStr);
		}
		else if(this.keyFields!=null)
		{
			this.addKeyFieldWhere(sql, param);
		}
		return new ParamParser(sql.toString(),param.toArray());
	}
	/**
	 * 用来查询是否存在的SQL语句
	 * 
	 * 此语句的过滤子句的规则是：
	 * 当设置了过滤子句 filterStr则过滤子句为filterStr;
	 * 当没有设置filterStr时候，如设置了关键字段keyFields则会按照关键字段的值构建一个过滤字句
	 * 如二者皆没有设置 那么就没有过滤子句
	 * @return
	 */
	public ParamParser getCountSQLParams()
	{
		StringBuffer sql=new StringBuffer();
		List param=new ArrayList();
		sql.append("SELECT COUNT(0) FROM ").append(this.tableName);
		if(this.filterStr!=null)
		{
			sql.append(" WHERE ").append(this.filterStr);
		}
		else if(this.keyFields!=null)
		{
			addKeyFieldWhere(sql,param);
		}
		return new ParamParser(sql.toString(),param.toArray());
	}
	/**
	 * 以关键字段构成过滤子句
	 * @return
	 */
	private void addKeyFieldWhere(StringBuffer sql,List param)
	{
		sql.append(" WHERE ");
		//从设置的关键字段构建where字句
		int i=0,len=this.keyFields.length;
		for(;i<len;i++)
		{
			param.add(this.fields.get(keyFields[i]));
			sql.append(keyFields[i]).append("=").append("?");
			if(i<len-1){sql.append(" AND ");}
			i++;
		}
	}
	/**
	 * set the order sub sql 
	 */
	public void setOrderStr(String orderStr) {
		this.orderStr = orderStr;
	}
	public String[] getKeyFields()
	{
		return keyFields;
	}
	public void setKeyFields(String[] keyFields)
	{
		this.keyFields = keyFields;
	}
	public void setKeyField(String keyField)
	{
		this.keyFields=new String[]{keyField};
	}
	public void setQueryFilds(String[] queryFilds) {
		this.queryFields = queryFilds;
	}
	
	
	
}
